// 自己来写user模块中的代码
import { reqLogin, reqGetUserInfo, reqGetUserDetailById } from '@/api/user'
import { setToken, getToken, removeToken } from '@/utils/auth'
const state = {
  // 获取token
  token: getToken() || null,
  // 个人信息资料
  userInfo: {}
}

const mutations = {
  // 存储token的mutation
  setToken(state, token) {
    state.token = token
  },
  // 移除token
  removeToken(state) {
    // 移除vuex中的token
    state.token = null
    // 移除本地存储的token
    removeToken()
  },
  // 存储个人资料
  setUserInfo(state, userInfo) {
    state.userInfo = userInfo
  },
  // 清空个人信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // 登录的action
  async login(context, data) {
    /*  return new Promise((resolve, reject) => {
      reqLogin(data).then(res => {
        // 提交mutation存储token
        context.commit('setToken', res.data)
        // 存储token在cookie中
        setToken(res.data)
        resolve(res)
      }).catch(err => {
        console.log(err)
        reject(err)
      })
    }) */
    // 改造 原生promise包装, 被async修饰的函数的返回值是一个promise
    const res = await reqLogin(data)
    // 提交mutation存储token
    context.commit('setToken', res.data)
    // 存储token在cookie中
    setToken(res.data)
    return res // 这句话就相当于 原生promise中 resolve(res)
  },
  // 获取个人信息的action
  async getUserInfo(context) {
    /* return new Promise((resolve, reject) => {
      reqGetUserInfo().then(res => {
        console.log('获取资料成功')
        // console.log(res)
        // 提交一个mutation 存储个人信息
        context.commit('setUserInfo', res.data)
        resolve(res)
      }).catch(err => {
        console.log(err)
        reject(err)
      })
    }) */
    // 解构赋值的重命名 { a: 别名}
    const { data: res1 } = await reqGetUserInfo()
    const { data: res2 } = await reqGetUserDetailById(res1.userId)
    const obj = { ...res1, ...res2 }
    // console.log(obj)
    // 提交一个mutation 存储个人信息
    context.commit('setUserInfo', obj)
    return obj // 这句话就相当于 原生promise中 resolve(res)
  },
  // 移除token和移除个人信息的action
  logout(context) {
    context.commit('removeToken')
    context.commit('removeUserInfo')
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
